#include "Humain.h"

#include "MetaRace.h"

#include <iomanip>

#include <boost/assign/list_of.hpp>

using namespace std;
using namespace boost::assign;

// const unsigned Humain::nbrEnsembles = 0;

// const unsigned Humain::nbrCapacites = 0;

// const unsigned Humain::ppAlloues = 10;

// const unsigned Humain::taille = 4;

// const vector< CapaciteRaciale > Humain::Liste = list_of
//   (CapaciteRaciale("Agressivité"      ,  5))
//   (CapaciteRaciale("PV supplémentaire", 10))
//   (CapaciteRaciale("Portes secrètes"  , 10))
//   (CapaciteRaciale("Solidité"         ,  5));

/**
 * Constructeur simplifié, qui remplit simplement le conteneur des capacités.
 * Il est utilisé lors de la lecture d'un fichier XML.
 *
 * @param[in] cap conteneur des capacité
 */
Humain::Humain(const vector<unsigned>& cap)
  : Race("Humain")
{
  MetaRace recup( "Humain" );

  StatusCode sc( recup.lireFichier() );

  if ( ! sc )
    {
      error() << sc.message() << endmsg;
      error() << "Le programme va quitter" << endmsg;
      exit( sc.code() );
    }

  NombrePPsAlloues = recup.nombrePPsAlloues();

  recup.copieCapacitesRaciales( NombreTotalCapacites, CapacitesRaciales );

  recup.donneesEnsRaciaux( NombreTotalEnsembles, NombreMaxCapacites );

  EnsemblesRaciaux.assign( recup.ensemblesRaciaux() -> begin(),
			   recup.ensemblesRaciaux() -> end() );

  // CapacitesRaciales    = Liste;
  // NombreTotalCapacites = taille;
  // NombreTotalEnsembles = nbrEnsembles;
  // NombreMaxCapacites   = nbrCapacites;

  Capacites.assign( cap.begin(), cap.end() );
}

/**
 * Constructeur usuel, qui permet de créer un Demi-Elfe en sélectionnant
 * ses capacités.
 *
 * @param[in] PP nombre de pp, passé en argument afin de pouvoir
 * récupérer les pp non dépensé
 */
Humain::Humain(unsigned& PP)
  : Race("Humain")
{
  MetaRace recup( "Humain" );

  StatusCode sc( recup.lireFichier() );

  if ( ! sc )
    {
      error() << sc.message() << endmsg;
      error() << "Le programme va quitter" << endmsg;
      exit( sc.code() );
    }

  NombrePPsAlloues = recup.nombrePPsAlloues();

  recup.copieCapacitesRaciales( NombreTotalCapacites, CapacitesRaciales );

  recup.donneesEnsRaciaux( NombreTotalEnsembles, NombreMaxCapacites );

  EnsemblesRaciaux.assign( recup.ensemblesRaciaux() -> begin(),
			   recup.ensemblesRaciaux() -> end() );
  // NombrePPsAlloues = ppAlloues;

  // CapacitesRaciales    = Liste;
  // NombreTotalCapacites = taille;
  // NombreTotalEnsembles = nbrEnsembles;
  // NombreMaxCapacites   = nbrCapacites;

  blank() << setfill('*') << setw(56) << '*' << endmsg;
  blank() << "Création d'un humain" << endmsg << endmsg;
  PP += 10;

  construitRace( PP );

  blank() << endmsg << setfill('*') << setw(56) << '*' << endmsg;
}

Humain::Humain()
  :Race("Humain")
{
  MetaRace recup( "Humain" );

  StatusCode sc( recup.lireFichier() );

  if ( ! sc )
    {
      error() << sc.message() << endmsg;
      error() << "Le programme va quitter" << endmsg;
      exit( sc.code() );
    }

  NombrePPsAlloues = recup.nombrePPsAlloues();

  recup.copieCapacitesRaciales( NombreTotalCapacites, CapacitesRaciales );

  recup.donneesEnsRaciaux( NombreTotalEnsembles, NombreMaxCapacites );

  EnsemblesRaciaux.assign( recup.ensemblesRaciaux() -> begin(),
			   recup.ensemblesRaciaux() -> end() );

  // NombrePPsAlloues = ppAlloues;

  // CapacitesRaciales    = Liste;
  // NombreTotalCapacites = taille;
  // NombreTotalEnsembles = nbrEnsembles;
  // NombreMaxCapacites   = nbrCapacites;
}

/**
 * Constructeur de "copie", qui permet de créer une instance à partir
 * de MetaClasse.
 *
 * @param[in] ptr pointeur sur l'instance à copier.
 */
Humain::Humain(Race *ptr )
  : Race( *ptr )
{}

/**
 * Destructeur, ne fait rien de spécial.
 */
Humain::~Humain()
{}
